package com.etime.shycourse.services.wxcoupon.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.etime.shycourse.dao.CouponMapper;
import com.etime.shycourse.dao.CouponrangeMapper;
import com.etime.shycourse.dto.CouponMyDto;
import com.etime.shycourse.orde.dao.OrderdetailMapper;
import com.etime.shycourse.orde.dao.OrdersMapper;
import com.etime.shycourse.orde.pojo.Orderdetail;
import com.etime.shycourse.orde.pojo.Orders;
import com.etime.shycourse.orde.utils.IdWorker;
import com.etime.shycourse.pojo.Couponrange;
import com.etime.shycourse.services.wxcoupon.interfaces.WXCouponUseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

/**
 * 优惠券使用结算服务层
 */
@Service
public class WXCouponUseServiceImpl implements WXCouponUseService {
    @Autowired
    private OrdersMapper ordersMapper;
    @Autowired
    private OrderdetailMapper orderdetailMapper;
    @Autowired
    private CouponMapper couponMapper;
    @Autowired
    private CouponrangeMapper couponrangeMapper;
    /**
     * 根据订单id获取该订单能够使用的优惠券列表
     * 1、查询出订单详情；
     * 2、查询订单明细
     * 3、根据用户id，查询出用户所能使用的所有优惠券列表
     * 4、逐一处理优惠券列表中的优惠券，判断启是否能在当前订单中使用；
     *    如果不能使用，则从列表中排除
     * @param orderid 订单id
     * @return
     */
    @Override
    public List<CouponMyDto> selectOrderUsedCouponList(Integer orderid) {
        //1、查询出订单详情；
        Orders orders = ordersMapper.selectById(orderid);
        //2、查询订单明细
        QueryWrapper<Orderdetail> wrapper = new QueryWrapper<>();
        wrapper.eq("orderid",orderid);
        List<Orderdetail> orderdetailList = orderdetailMapper.selectList(wrapper);
        //3、根据用户id，查询出用户所能使用的所有优惠券列表
        List<CouponMyDto> couponlist = couponMapper.selectMyCouponList(orders.getOrderuserid());
        //处理每一个优惠券，判断其是否能在指定订单中使用
        for(CouponMyDto coupon : couponlist){
            coupon.setUseflag(1);
            //在结算的时候不使用兑换卷
            if(coupon.getCoupontype()<2000){
                //兑换券，移除
                coupon.setUseflag(0);
                coupon.setUsermsg("兑换券，请到我的优惠券中兑换课程");
                continue;
            }
            //如果有满多少可用
            if(coupon.getCouponfull().compareTo(BigDecimal.ZERO)>0){
                if(coupon.getCouponfull().compareTo(orders.getOrderpayamount())>=0){
                    //订单金额不满足
                    coupon.setUseflag(0);
                    coupon.setUsermsg("订单金额不满足优惠券使用条件");
                    //couponlist.remove(coupon);
                    continue;
                }
            }
            //指定课程课程
            if(coupon.getCouponcourseimpose() == 1){
                //有课程限制
                //查询优惠券所限制的课程列表
                List<Couponrange> range = selectCouponRang(coupon.getCouponid());
                boolean flag = false;
                for(Couponrange r : range){
                    for(Orderdetail orderdetail : orderdetailList){
                        if(r.getRangecourseid().equals(orderdetail.getOdcourseid())){
                            flag = true;
                            break;
                        }
                    }
                    if(flag){
                        break;
                    }
                }
                if(!flag){
                    coupon.setUseflag(0);
                    coupon.setUsermsg("优惠券的使用范围中不包含当前订单中的课程");
                }
            }
        }

        return couponlist;
    }

    /**
     * 选择使用优惠券
     * 业务逻辑：
     * 在选择使用优惠券后，需要更新订单信息，在订单中添加优惠券的使用情况。但是不修改订单状态
     * 订单状态在支付完成之后进行修改。
     *
     * 抵扣券和折扣券，如果有使用范围，那么只能在使用范围内的课程中有效
     * @param orderid 订单id
     * @param couponreciveid 优惠券领取id
     * @return
     */
    @Override
    public int updateOrderByUseCoupon(Integer orderid, Integer couponreciveid) {
        //根据id查询订单的详细信息
        Orders orders = ordersMapper.selectById(orderid);
        //根据优惠券领取id查询优惠券详细信息
        CouponMyDto coupon = couponMapper.selectCouponByReciveId(couponreciveid);
        if(coupon.getCouponcourseimpose()==0){
            //不限制
            if(coupon.getCoupontype()>2000 && coupon.getCoupontype()<3000){
                //抵扣券
                //抵扣券，最多只能抵扣订单金额的最大值。
                if(orders.getOrderpayamount().compareTo(coupon.getCouponmoney())>=0){
                    orders.setOrdercouponmoney(coupon.getCouponmoney());
                    orders.setOrdercoupondemo("使用抵扣券最大金额"+coupon.getCouponmoney().toString());
                }else{
                    orders.setOrdercouponmoney(orders.getOrderpayamount());
                    orders.setOrdercoupondemo("订单金额没有超过抵扣券抵扣金额，抵扣完此订单金额");
                }
            }else if(coupon.getCoupontype()>3000 && coupon.getCoupontype()<4000){
                //打折券
                orders.setOrdercouponmoney(orders.getOrderpayamount().multiply(coupon.getCoupondiscount()));
                orders.setOrdercoupondemo("订单整体打折："+coupon.getCoupondiscount().toString());
            }
        }else{
            //有限制
            //1 查询订单详情列表
            QueryWrapper<Orderdetail> wrapper = new QueryWrapper<>();
            wrapper.eq("orderid",orderid);
            List<Orderdetail> orderdetailList = orderdetailMapper.selectList(wrapper);
            //2 查询优惠券使用范围
            List<Couponrange> range = selectCouponRang(coupon.getCouponid());
            //3 清除订单详情中，不包含在优惠券使用范围中的课程
            //List<Orderdetail> buflist = new ArrayList<>();
            for(Orderdetail od : orderdetailList){
                boolean flag = false;
                for(Couponrange r :range){
                    if(od.getOdcourseid().equals(r.getRangecourseid())){
                        flag = true;
                        break;
                    }
                }
                if(!flag){
                    orderdetailList.remove(od);
                    //buflist.add(od);
                }
            }
            //计算能够使用优惠券的课程的总金额
            BigDecimal sum = new BigDecimal(0);
//            if(buflist.size()>0) {
//                for(Orderdetail delorderdetail : buflist){
//                    orderdetailList.remove(delorderdetail);
//                }
//            }
            //if(orderdetailList)
                for (Orderdetail odused : orderdetailList) {
                    sum = odused.getOdprice().add(sum);
                }

            if(coupon.getCoupontype()>2000 && coupon.getCoupontype()<3000){
                //抵扣券
                //抵扣券，最多只能抵扣sum最大值。
                if(sum.compareTo(coupon.getCouponmoney())>=0){
                    orders.setOrdercouponmoney(coupon.getCouponmoney());
                    orders.setOrdercoupondemo("在抵扣券的使用范围内抵扣最大金额");
                }else{
                    orders.setOrdercouponmoney(sum);
                    orders.setOrdercoupondemo("在抵扣券的使用范围内抵扣所有的金额");
                }
            }else if(coupon.getCoupontype()>3000 && coupon.getCoupontype()<4000){
                //打折券
                orders.setOrdercouponmoney(sum.multiply(coupon.getCoupondiscount()));
                orders.setOrdercoupondemo("在打折券的使用范围内进行打折-部分打折");
            }
        }
        //保存更新订单信息
        orders.setOrdercouponreciveid(couponreciveid);
        orders.setCouponno(coupon.getCouponno());
        IdWorker idWorker = new IdWorker();
        orders.setOrderno(idWorker.nextId()+"");
        return ordersMapper.updateById(orders);
    }

    /**
     * 获取优惠券使用范围
     * @param couponid
     * @return
     */
    private List<Couponrange> selectCouponRang(Integer couponid){
        QueryWrapper<Couponrange> wrapper = new QueryWrapper<>();
        wrapper.eq("couponid",couponid);
        return couponrangeMapper.selectList(wrapper);
    }
}
